package com.xf.system.common.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xf.system.common.mapper.DeptMapper;
import com.xf.system.common.model.Dept;
import com.xf.system.enums.StatusEnum;
import com.xf.system.http.req.dept.DeptListReqDTO;
import com.xf.system.http.vo.dept.DeptTreeVO;
import com.xf.system.http.vo.user.UserDeptDetailVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;

/**
 * @author xiefengf
 */
@Slf4j
@Service
public class DeptService extends ServiceImpl<DeptMapper, Dept> {

    @Resource
    private DeptMapper deptMapper;

    /**
     * 查询当前用户对应的所有部门信息
     *
     * @param id 用户主键id
     * @return 部门列表
     */
    public List<UserDeptDetailVO> selectDeptByUid(Long id) {
        return deptMapper.selectDeptByUid(id);
    }

    /**
     * 条件查询所有部门数据
     *
     * @param reqDto 部门名称+部门状态
     * @return 部门列表
     */
    public List<Dept> selectDeptList(DeptListReqDTO reqDto) {
        return deptMapper.selectDeptList(reqDto);
    }

    /**
     * 通过部门id查询部门详情信息
     *
     * @param id 部门id
     * @return 部门详情信息
     */
    public DeptTreeVO selectDeptById(Long id) {
        return deptMapper.selectDeptById(id);
    }

    /**
     * 根据部门名+父部门id查询部门数据
     *
     * @param deptName 部门名称
     * @param parentId 父部门id
     * @return 部门详细信息
     */
    public Dept selectDeptByName(String deptName, Long parentId) {
        return deptMapper.selectDeptByName(deptName, parentId);
    }

    /**
     * 根据ID查询所有子部门（正常状态+停用状态）
     *
     * @param id 部门主键id
     * @return 子部门数
     */
    public List<Dept> selectChildrenDeptById(Long id) {
        LambdaQueryWrapper<Dept> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Dept::getParentId,id);
        return deptMapper.selectList(wrapper);
    }

    /**
     * 根据ID查询所有子部门（正常状态）
     *
     * @param id 部门主键id
     * @return 子部门数
     */
    public List<Dept> selectNormalChildrenDeptById(Long id) {
        LambdaQueryWrapper<Dept> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Dept::getParentId,id)
                .eq(Dept::getStatus, StatusEnum.ENABLE.getValue());
        return deptMapper.selectList(wrapper);
    }

}
